
import java.util.ArrayList;

/**
 * TO-DO:
 * 
 */

/**
 * Write a description of class CAH here.
 * 
 * @author (Marcel) 
 * @version (23.1.15)
 */
public class CAH
{
    public ArrayList<Player> p;      //alle Spieler
    public Question q;               //alle Fragen
    public Answer a;                 //alle Antworten

    //private Player marcel;
    //private Player tobi;
    //private Player amin;

    public boolean alleAnt;         //haben alle ihre antworten gegeben?
    public boolean alleRdy;         //ist die runde beendet?
    public int gewinner;            //selbstsprechend
    public int werIstJury;          //rotation der jury
    public String frage;            //frage der aktuellen runde
    public int anzAnt;              //wie viele antworten benötigt die frage
    private boolean spielEnde;      //falls das spiel zuende ist
    private String nameGewinnerEnde;

    private int anzahlSiege;

    public CAH(int pAnzahlSiege)
    {
        p=new ArrayList<Player>();
        q=new Question();
        a=new Answer();

        spielEnde = false;
        anzahlSiege = pAnzahlSiege;
        nameGewinnerEnde = "";

        //marcel=new Player("Marcel");
        // tobi=new Player("Tobi");
        // amin=new Player("Amin");

        // p.add(marcel);
        // p.add(tobi);
        // p.add(amin);

        werIstJury=0;
    }

    public void newPlayer(Player pTemp)
    {
        p.add(pTemp);
    }

    public void spielBeginn()
    {       
        nrWeisen();
        spielEnde = false;
        juryBestimmen();
        kartenAusteilen();
        frageStellen();
    }
    
    public void nrWeisen()
    {
        for(int i=0;i<p.size();i++)
        {
            p.get(i).setListStelle(i);
        }
    }

    public void spielVerlauf()          //Spiel rotation
    {
        juryRdy();
        if(alleRdy==true)
        {
            gewinner=p.get(werIstJury).getWahl();
            p.get(gewinner).plusPunkt();
            setAllFalse();
            alleRdy=false;
            alleAnt=false;
            if(p.get(gewinner).getPunkte()==anzahlSiege)
            {
                spielEnde = true;
                spielEnde();
            }
            else{
                juryBestimmen();
                neueKarteGeben();
                frageStellen();
            }
        }
        else
        {
            //System.out.println("Es sind noch nicht alle bereit.");
        }
    }

    public void spielEnde()
    {
        //System.out.println("Der Spieler"+p.get(gewinner)+" hat gewonnen");
        nameGewinnerEnde = p.get(gewinner).name;
        setAllFalse();
    }

    public void neueKarteGeben()        //die Karten jedes Spieler werden auf 6 aufgefüllt
    {
        for(int i=0;i<p.size();i++)
        {
            Player temp=p.get(i);
            if(temp.getAnzahlKarten()<6)
            {
                temp.karteHinzufuegen(a.getAntwort());
            }
            if(temp.getAnzahlKarten()<6)
            {
                temp.karteHinzufuegen(a.getAntwort());
            }
        }
    }

    public void kartenAusteilen()       //jeder Spieler erhält 6 zufällige Karten
    {
        for(int i=0;i<p.size();i++){           
            Player temp=p.get(i);
            neueKarte(temp);
            neueKarte(temp);
            neueKarte(temp);
            neueKarte(temp);
            neueKarte(temp);
            neueKarte(temp);

            p.set(i,temp);
        }
    }
    
    public int getAnzSiege() {
        return anzahlSiege;
    }
    
    public void neueKarte(Player test)
    {
        String x=a.getAntwort();
        while(x.equals("pech"))
        {
            x=a.getAntwort();
        }
        test.karteHinzufuegen(x);
    }

    public void juryBestimmen()     //jeder wird eine Runde die jury
    {                               //falls jeder dran war beginnt es von neuem
        Player temp=p.get(werIstJury);
        if(werIstJury==p.size()-1)
        {
            temp.setJuryFalse();
            werIstJury=0;
            p.get(0).setJuryTrue();
        }
        else
        {
            temp.setJuryFalse();
            werIstJury++;
            p.get(werIstJury).setJuryTrue();
        }
    }

    public void frageStellen()
    {
        frage="pech";
        while(frage.equals("pech")){
            frage=q.getFrage();
        }
        anzAnt=q.getanzAntworten();
        for(int i=0;i<p.size();i++)
        {
            Player temp=p.get(i);
            temp.setAnzAnt(anzAnt);
            p.set(i,temp);
        }
    }

    public void alleAnt()
    {
        for(int i=0;i<p.size();i++)
        {
            if(p.get(i).getJury()==false)
            {
                if(p.get(i).getAnt()==false)
                {
                    alleAnt=false;
                    return;
                }
            }
        }
        alleAnt = true;
    }

    public void juryRdy()
    {
        for(int i=0;i<p.size();i++)
        {
            if(p.get(i).getJury()==true)
            {
                if(p.get(i).getRdy()==false)
                {
                    alleRdy=false;
                    return;
                }
            }
        }
        alleRdy = true;
    }

    public void setAllFalse()
    {
        for(int i=0;i<p.size();i++)
        {
            p.get(i).setAllBack();
        }
    }

    public ArrayList<Player> getSpieler() {
        return p;
    }

    public Player getPlayer(String pName) {
        for (int i=0; i<p.size(); i++) {
            if (p.get(i).name.equals(pName)) {
                return p.get(i);
            }
        }
        return null;
    }

    public int stelleVonNutzer(String pName) {
        for (int i=0; i<p.size(); i++) {
            if (p.get(i).name.equals(pName)) {
                return i;
            }
        }
        return -1;
    }

    public String getGewinnerRunde() {
        return p.get(gewinner).name;
    }
    public String getGewinnerAntRunde() {
        return p.get(gewinner).antwort1;
    }

    public String getNameGewinnerEnde() {
        return nameGewinnerEnde;
    }

    public boolean istSpielEnde() {
        return spielEnde;
    }
    
    public String getAnzAnt() {
        return ""+anzAnt;
    }
}
